{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Performance comparison"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Geosnap not installed, will have to source some datasets elsewhere\n"
     ]
    }
   ],
   "source": [
    "%matplotlib inline\n",
    "\n",
    "try:\n",
    "    from geosnap import datasets\n",
    "except:\n",
    "    print(\"Geosnap not installed, will have to source some datasets elsewhere\")\n",
    "import geopandas\n",
    "import pandas\n",
    "import esda\n",
    "import pygeoda\n",
    "import os\n",
    "import libpysal as ps\n",
    "from time import time\n",
    "\n",
    "PERMS = 9999\n",
    "\n",
    "from libpysal.examples import get_path, load_example"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Copying: 0.00B [00:00, ?B/s]\n",
      "Copying: 0.00B [00:00, ?B/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "CPU times: user 904 ms, sys: 165 ms, total: 1.07 s\n",
      "Wall time: 10 s\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\n"
     ]
    }
   ],
   "source": [
    "%%time\n",
    "from geosnap.io import store_census\n",
    "store_census()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- Counties"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "_ = load_example(\"NCOVR\")\n",
    "\n",
    "counties = geopandas.read_file(get_path(\"NAT.shp\"))\n",
    "w_counties = ps.weights.Queen.from_dataframe(counties)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- Tracts"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "CPU times: user 3.58 s, sys: 201 ms, total: 3.79 s\n",
      "Wall time: 3.75 s\n"
     ]
    }
   ],
   "source": [
    "%%time\n",
    "try:\n",
    "    tracts = geopandas.read_file(\"tracts.gpkg\")\n",
    "except:\n",
    "    tracts = datasets.tracts_2010()\\\n",
    "                     [[\"geoid\", \"median_household_income\", \"geometry\"]]\\\n",
    "                     .dropna()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "CPU times: user 39.3 s, sys: 723 ms, total: 40 s\n",
      "Wall time: 40 s\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/opt/conda/lib/python3.7/site-packages/libpysal/weights/weights.py:167: UserWarning: The weights matrix is not fully connected: \n",
      " There are 37 disconnected components.\n",
      " There are 16 islands with ids: 20, 50, 52, 24654, 35292, 36380, 41050, 41070, 43397, 45974, 48067, 48586, 48788, 63773, 68790, 70510.\n",
      "  warnings.warn(message)\n"
     ]
    }
   ],
   "source": [
    "%%time\n",
    "w_tracts = ps.weights.Queen.from_dataframe(tracts)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Remove islands:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "metadata": {},
   "outputs": [],
   "source": [
    "tracts_noi = tracts[~tracts.index.isin(w_tracts.islands)]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 43,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/opt/conda/lib/python3.7/site-packages/libpysal/weights/weights.py:167: UserWarning: The weights matrix is not fully connected: \n",
      " There are 21 disconnected components.\n",
      "  warnings.warn(message)\n"
     ]
    }
   ],
   "source": [
    "w_tracts_noi = ps.weights.w_subset(w_tracts, tracts_noi.index.tolist())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 44,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[]"
      ]
     },
     "execution_count": 44,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "w_tracts_noi.islands"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Setup"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 58,
   "metadata": {},
   "outputs": [],
   "source": [
    "def workbench(\n",
    "    db, \n",
    "    y_name, \n",
    "    w, \n",
    "    perms=PERMS, \n",
    "    runs=5, \n",
    "    save_last=False,\n",
    "    no_numba=True,\n",
    "    numba_single=True,\n",
    "    numba_multi=True,\n",
    "    geoda=True\n",
    "):\n",
    "    print(f\"Workbench working on a {os.cpu_count()}-core machine\")\n",
    "    times = {}\n",
    "    if no_numba:\n",
    "        times[\"No Numba\"] = []\n",
    "    if numba_single:\n",
    "        times[\"Numba - Single Thread\"] = []\n",
    "    if numba_multi:\n",
    "        times[\"Numba - Multi Thread\"] = []\n",
    "    if geoda:\n",
    "        times[\"PyGeoda\"] = []\n",
    "    # Ensure function is compiled\n",
    "    if numba_single:\n",
    "        one = esda.Moran_Local(db[y_name], \n",
    "                               w, \n",
    "                               permutations=1,\n",
    "                               numba=True,\n",
    "                               n_jobs=1\n",
    "                              )\n",
    "    if numba_multi:\n",
    "        one = esda.Moran_Local(db[y_name], \n",
    "                               w, \n",
    "                               permutations=1,\n",
    "                               numba=True,\n",
    "                               n_jobs=-1\n",
    "                              )\n",
    "    # PyGeoda setup\n",
    "    if geoda:\n",
    "        db.to_file(\"tmp\")\n",
    "        db_geoda = pygeoda.open(\"tmp/tmp.shp\")\n",
    "        y_geoda = db_geoda.GetIntegerCol(y_name)\n",
    "        w_geoda = pygeoda.weights.queen(db_geoda)\n",
    "    for i in range(runs):\n",
    "        # Pre-numba\n",
    "        if no_numba:\n",
    "            t0 = time()\n",
    "            old = esda.Moran_Local(db[y_name], \n",
    "                                   w, \n",
    "                                   permutations=perms\n",
    "                                  )\n",
    "            t1 = time()\n",
    "            times[\"No Numba\"].append(t1-t0)\n",
    "        # Numba single thread\n",
    "        if numba_single:\n",
    "            t0 = time()\n",
    "            one = esda.Moran_Local(db[y_name], \n",
    "                                   w, \n",
    "                                   permutations=perms,\n",
    "                                   numba=True,\n",
    "                                   n_jobs=1\n",
    "                                  )\n",
    "            t1 = time()\n",
    "            times[\"Numba - Single Thread\"].append(t1-t0)\n",
    "        # Numba multi thread\n",
    "        if numba_multi:\n",
    "            t0 = time()\n",
    "            mul = esda.Moran_Local(db[y_name], \n",
    "                                   w, \n",
    "                                   permutations=perms,\n",
    "                                   numba=True,\n",
    "                                   n_jobs=-1\n",
    "                                  )\n",
    "            t1 = time()\n",
    "            times[\"Numba - Multi Thread\"].append(t1-t0)\n",
    "        # PyGeoDa\n",
    "        if geoda:\n",
    "            lisa_geoda = pygeoda.local_moran(w_geoda, y_geoda)\n",
    "            lisa_geoda.SetPermutations(perms)\n",
    "            t0 = time()\n",
    "            lisa_geoda.Run()\n",
    "            t1 = time()\n",
    "            times[\"PyGeoda\"].append(t1-t0)\n",
    "    if save_last:\n",
    "        last = {}\n",
    "        if no_numba:\n",
    "            last[\"No Numba\"] = old.p_sim\n",
    "        if numba_single:\n",
    "            last[\"Numba - Single Thread\"] = one.p_sim\n",
    "        if numba_multi:\n",
    "            last[\"Numba - Multi Thread\"] = mul.p_sim\n",
    "        if geoda:\n",
    "            last[\"PyGeoda\"] = lisa_geoda.GetPValues()\n",
    "        pvals = pandas.DataFrame(last)\n",
    "    else:\n",
    "        pvals = None\n",
    "    if geoda:\n",
    "        os.system(\"rm -rf tmp\")\n",
    "    return pandas.DataFrame(times), pvals"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## All counties"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 53,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Workbench working on a 8-core machine\n",
      "CPU times: user 2min 38s, sys: 2.84 s, total: 2min 41s\n",
      "Wall time: 56.1 s\n"
     ]
    }
   ],
   "source": [
    "%%time\n",
    "res_counties = workbench(counties, \n",
    "                         \"HR70\", \n",
    "                         w_counties, \n",
    "                         perms=9999, \n",
    "                         runs=7,\n",
    "                         save_last=True\n",
    "                        )\n",
    "timing_counties, pvals_counties = res_counties"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 54,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "No Numba                 3.511575\n",
       "Numba - Single Thread    1.073173\n",
       "Numba - Multi Thread     0.568531\n",
       "PyGeoda                  1.108585\n",
       "dtype: float64"
      ]
     },
     "execution_count": 54,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "timing_counties.mean()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 55,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.axes._subplots.AxesSubplot at 0x7fd0ad72cb50>"
      ]
     },
     "execution_count": 55,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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yMvLY8iQIXz99dcR2xg+fDirV69m3bp1NdYF97Dnz5/PmDFjABgzZgwTJkzg7LPPplu3bnz44YeMHTuW008/PVDH784776SwsJAhQ4YErg0/9thjFBcX06dPHy677DIOHDjQwGfAQHR3uRhjovTH/1vNmu/Cv3d3ZHqe1JLfj4j45esQEydOJC8vj1/96lch5ZMmTWL06NFcf/31PP7440yePJlXXqn53T+Hw8GvfvUr/vznP/Pkk09GHd+PP/7I+++/z2uvvcaIESNYtGgRf/vb3yguLqa0tJT8/HzKy8spLCzkL3/5C/feey9//OMfmTVrFpdeeik333wzAHfffTdz587ltttui3rfJpT10I1JES1btmT06NHMmDEjpHzx4sVcffXVAFx33XV8/PHHtbZx9dVX85///IfNmzdHvd8RI0YgIuTm5tKuXTtyc3NxOBz06tUrcA3e4XBw5ZVXAnDttdcGYli1ahVnnXUWubm5lJSUsHr16lgO2YSxHroxcRRNT7ox3X777RQWFnLDDTfUWqeuuydcLhd33nknDzzwQK3bhH+BKiMjA/Ambf+8f7mqqqrOGMaMGcMrr7xCnz59mDdvHgsWLKg1NlM/66Ebk0Jat27NyJEjmTt3bqBswIABPPvsswCUlJQwcODAOtsYM2YM7777bsg90O3atWPt2rV4PB5efvnlmOPyeDzMnz8fgH/84x+BGPbv30/79u2prKykpKQk5nZNKEvoxqSYO++8M+RulxkzZvDEE0+Ql5fH008/zfTp0+vcPj09ncmTJ7N9+/ZA2f3338/w4cM555xzaN++fcwxZWVlsXr1avr27cv777/P737n/Q2c//qv/+KnP/0p5513Hj169Ii5XRNKEvUN/aKiIl2yZElC9m1MPK1du5bTTz890WGYFBTptSUiS1W1KFJ966EbY0yKsIRujDEpwhK6McakCEvoxhiTIiyhG2NMirCEbowxKcISujEp4EiHz63LmDFjAl8KiqcDBw5wzTXXkJubS+/evRk4cCBlZWWA98tQDTVv3jwmTZoUVd1//etf5Ofnk5+fT3Z2Njk5OeTn5zN69OiY2jlS8Rpe2BK6MSkgHsPnHm3Tp0+nXbt2rFy5klWrVjF37tzA72f++9//PioxDB06lNLSUkpLSykqKqKkpITS0lKeeuqpqNtwu92NGGFsLKEbkwLq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vvLxRIdijDEJkTIJ/fQ2pzO823D+vvbvfF/+faLDMcaYoy5lEjp4hwTwqIe/lv410aEYc1T5h4Tt3bs3V1xxBQcOHKiz/pdffsnw4cM55ZRT6Nu3L2effTYLFy6MSyzBA2qZoyulEnqH7A6M6jGKVze+ypc/fpnocIw5avxDwq5atYr09HTmzJlTa91Dhw5x4YUXMm7cODZu3MjSpUuZOXNmYFwSk7xSKqED3Jx7M1muLB7+/OFEh2JMQpx11lls2LCBe+65h+nTpwfK77rrLmbMmEFJSQn9+/fnoosuCqzr3bs3Y8aMAaC8vJyxY8dSXFxMQUEBr776KuA9Edxwww3k5uZSUFDABx98AMDBgwe56qqryMvL48orr+TgwYOBdmsbVtY0jqQcnKsux2Uex425N/Lw5w/z2fefUXxicaJDMk3I93/+M4fXxnf43IzTe3Dib38bVd2qqirefPNNLrjgAoYNG8all17KlClT8Hg8PPvss3z66afcd999FBYW1trGfffdxznnnMPjjz/Onj176NevH+eee26g179y5Uq++OILzj//fNavX8/s2bNp3rw5K1asYMWKFSFtRxpWNi8v78ieEFOrlOuhA1xz+jW0a96OaUun2c/VmSbh4MGD5OfnU1RUROfOnbnxxhvp0qULbdq0YdmyZbz99tsUFBTQpk2bGttecskl9O7dm0svvRSAt99+m/vvv5/8/HwGDx7MoUOH+Prrr/n444+57rrrAO/AUyeffDLr169n4cKFgaFh8/LyQhJ2pGFlTeNJuR46QKYrk0kFk7hn0T28veVthnYZmuiQTBMRbU863vzX0MPddNNNzJs3j++//56xY8cC0KtXr5APQF9++WWWLFkS+IEIVeXFF18kJyd0WOq6OkeRhomta1hZ0zhSsocOMKLbCLof350Zn8+g0h37cKHGpIJLLrmEt956i88++4yhQ70dm6uvvppFixbx2muvBeoF3xUzdOhQZs6cGUjgy5YtA+BnP/sZJSUlAKxfv56vv/6anJyckPJVq1axYsUKgFqHlTWNp96ELiKPi8h2EVlVy/rBIrJXREp9j9/FP8zYOR1Obi+8na/3f80L619IdDjGJER6ejpnn302I0eODIw13qxZM15//XXmzJlDt27d6N+/P3/605+4++67AbjnnnuorKwkLy+P3r17c8899wBw66234na7yc3N5corr2TevHlkZGQwYcIEysrKyMvL43/+53/o168fQK3DyprGU+/wuSLyM6AMeEpVe0dYPxj4paoOj2XH8Rg+tz6qyk1v38SGPRv45yX/JDs9u1H3Z5qmY3n4XI/HQ2FhIS+88ALdu3dPdDgmRnEfPldVFwK74xPe0SUi3NH3DnYf2s281fMSHY4xR9WaNWs49dRTGTJkiCXzJiJeH4r2F5HlwHd4e+urI1USkXHAOIDOnTvHadd163VCLy7ocgFPrXmKK3OupG3ztkdlv8YkWs+ePe3LQk1MPD4U/Rw4WVX7ADOBV2qrqKqPqmqRqha1bXv0EuvkgslUeiqZvXz2UdunMcYcbUec0FV1n6qW+ebfANJE5IQjjiyOOrXsxMjTRvLSly+xaa/1WEz82fcdTLw15DV1xAldRE4U302oItLP1+auI2033sb3GU+mK5PpS6fXX9mYGGRmZrJr1y5L6iZuVJVdu3aRmZkZ03b1XkMXkWeAwcAJIrIV+D2Q5tvpHOByYIKIVAEHgav0GHxlt85szdjeY5m5bCbLti+j4CcFiQ7JpIiOHTuydetWduzYkehQTArJzMykY8eOMW1T722LjeVo3LYY7kDlAYa/PJwO2R14athTEb/dZowxx7Ijum0xlTRPa86t+bdSuqOU9795P9HhGGNMXDWphA5w8akX07VVVx5e+jBVnqpEh2OMMXHT5BK6y+FiauFUvtr3FS99+VKiwzHGmLhpcgkdYHCnwRT+pJDZy2dzoLLun+oyxphk0SQTuogwte9Udh7cyVNrnkp0OMYYExdNMqED5P8kn3M7n8sTq55g18Fj7rZ5Y4yJWZNN6ACTCydz2H2YOctr/0FdY4xJFk06oXdt1ZXLT7uc+evns2XflkSHY4wxR6RJJ3SAW/rcQpozjRmfz0h0KMYYc0SafEI/odkJjOk1hre3vM3KHSsTHY4xxjRYk0/oANf3up7Wma15aOlDNsCSMSZpWUIHstKymNBnAkt+WMLCrQvr38AYY45BltB9LjvtMk5ueTIPf/4wbo870eEYY0zMLKH7pDnSmFI4hQ17NvDaxtcSHY4xxsTMEnqQczufS17bPGaVzuJg1cFEh2OMMTGxhB5ERLij7x1sP7CdkrUliQ7HGGNiUu8vFh1r3GVlVG3fgTgEnE4Qh3fe4aiedzpBBHE4apSL+Oo6HN46YT9y0bddXwZ3GszclXO5rPtlHJ95fIKO1KQi9XjA7Q6aKnjcqNsNHk9gGqjj8aBuj69O+NQNqt66tdXxeEAB9Xjrqnr3qQr4l/11NFBPVaEB9ULreOupfz6qeniPP1BPq+uIIE4HOJyIy+mdRlp2OhGHE5wOxOnyToOWI28TVO5vw+kMqudA/GVOpze3hC+7XDXLj/KP6CRdQi//6CO+nXpH/Br0JffgRH+rQLn7IF//ZTA70pqH1nE6wSGI+E4KDvG+WBy+k0ak8qC2a7QhEvTA+6JFwsq966pfHLWtq6McIu+rxnZh5RG2q4EH07EAAA9USURBVG1foX+gvj9I/x9pxPKgP+DwsmjbCf6Dr6uuKkqk9j0R6weSqccN7uppIFm63d7tQpJz6NS7fViZqfHaluBlf0cLAvOBR/jz7XYf+8+pSGii950Yjh99HW0nToz77pIuoTfr1IKTbhoEKigCKoDDNw8QXA6qQeVKWLl6p+D7g/ZV9Sjrd65k0/5vGXFSIVmuZr7eRXWHJbR3QlBS8HiTjNuNqse73uMJLXdXQaU3aaiG91SCk09YOUSZtCJvF3GdBifS6t5YyHbB2xC8XVg54ScEqpM9/j9egsqDThL+spBtgk5igTYIrR9ULoF64VOJuE7C6wbvwiHeXpbvBCxpDsj098zSq3tvvj9Ub6/MFdQ7c1X3Dp2u6mWXq3rZlQYOJ7jSvPMuF+JM863zty8hPVFve9U9Rm9HwhFSJ3TqfYcaOBH7k6T/OQtJmg7fqvrqBSXhoHreDk09iboReqzhCV49HrSqqvodjzvsXU3wcpU76CRdFVIv5F1T8HJgm/C2w9qocld3CNxVIR2DzB494v48QBIm9DS206rsmcZp3P9ac0L/k5z8qWN7vj/wJg/siGE0RnGAeP8YA9PgeXGCw+V7gXsvGaHeHmrgrWwg8UYqr20+mvqeoORrIvP3Bj3xa1KBKt/jcJTbONJ8rxOX7zXkAmda6HKtD2dQXVfY685V/ZoM3kYcYW2ELUv4Ns7QqTgjlzd4/76/jShOAP5Lq5KWFvScB3dAPLXMR/o7oWZ5nW345yNsV9d8drsoXwixSbqETs+L4e7hoN6zZGAaPK9u8FT5esb+9VW++Uhlbu+T7KkKbP8Tj5vrtr7DYz98zOj8ifRq1jZoG0/YvsPLqoLaDC/zxeDft3q8L1xvNyioVxQ8L7WUN7B+YH/B89RSXtd80P6QoD/C8IdEKHPWs76WNmLaR6wP/7Hg/cPz/9sGHm7wVIYtV4G7MnTZUxVUL6jMXRmhzfCHO6i94O1jaK/qEFSU+epUBb3+qqpfe/5H8GvY/ziWBJ9Qau38REjAx7ozb4fz/hj3ZutN6CLyODAc2K6qvSOsF2A68HPgADBGVT+Pd6ABDgc40hut+WA3nHYe81+6kGnla3lswB1H/QMOk0Ai4Ls00uQEJ/3gzkh44tewk0O9Jwt36FTdkctDOj/By/7OD/V0ZqLosETVOSL6zk2N7eppu3W3Rvmni+bVOg+YBTxVy/phQHff46fAbN806bVIb8H4PuO5/9P7+fd3/+bMDmcmOiRjGl+g03R0Ok4mfuq9D11VFwK766jyC+Ap9foPcJyItI9XgIk28rSRdMzuyLSl0/DE87qqMcbEWb0JPQodgG+Clrf6ymoQkXEiskREluzYsSMOu258ac40JhdOZt2P6/jnpn8mOhxjjKlVPBJ6pAvLET+VUNVHVbVIVYvatm0bh10fHUO7DKVnm57MXDaTw+5ob1MwxpijKx4JfSvQKWi5I/BdHNo9ZjjEwZ1972Rb+TaeWdtIt0waY8wRikdCfw0YLV5nAHtVdVsc2j2m9Gvfj4EdBvLYysfYe3hvosMxxpga6k3oIvIMsBjIEZGtInKjiNwiIrf4qrwBbAI2AI8BtzZatAl2e+Ht7K/Yz9yVcxMdijHG1FDvbYuqOqqe9QrEf1CCY1BO6xxGnDKCkrUljOoxivbZKXMzjzEmBcTjkkuTMil/EgCzSmclOBJjjAllCT1G7bPbc03Pa/i/jf/Hut3rEh2OMcYEWEJvgBt730iL9BZM+3xaokMxxpgAS+gN0CqjFePyxrHo20V8su2TRIdjjDGAJfQGu6rHVbTPas9DSx+yIQGMMccES+gNlOHM4LaC21izaw1vbX4r0eEYY4wl9CNxYbcLyTk+hxnLZlDhrkh0OMaYJs4S+hFwiIM7+t7Bt2Xf8vy65xMdjjGmibOEfoQGdBjAGe3P4H9X/C/7K/YnOhxjTBNmCT0Opvadyp7De3hi1ROJDsUY04RZQo+Dnm16cmG3C3l6zdP8UP5DosMxxjRRltDj5LaC23Crm78u/2uiQzHGNFGW0OOkQ3YHrupxFa9seIWNezYmOhxjTBNkCT2OxuWOI8uVxcNLH050KMaYJsgSehwdl3kcY3PHsmDrApZ8vyTR4RhjmhhL6HF27enX0q55O6YtnYZ3qHhjjDk6LKHHWaYrk4n5E1mxcwXvbHkn0eEYY5oQS+iN4KJTLuLU405lxrIZVHoqEx2OMaaJsITeCJwOJ1P7TmXLvi28uP7FRIdjjGkiLKE3krM6nEVRuyJmL59NeWV5osMxxjQBltAbiYhwR9872H1oN/NWz0t0OMaYJsASeiPKbZvL0C5DeXL1k+w8uDPR4RhjUlxUCV1ELhCRdSKyQUR+E2H9YBHZKyKlvsfv4h9qcppcMJlKdyWzS2cnOhRjTIqrN6GLiBN4BBgG9ARGiUjPCFU/UtV83+PeOMeZtDq37MwVOVfw4pcvsnnv5kSHY4xJYdH00PsBG1R1k6pWAM8Cv2jcsFLL+LzxZDgzmP759ESHYoxJYdEk9A7AN0HLW31l4fqLyHIReVNEekVqSETGicgSEVmyY8eOBoSbnNo0a8PY3mN57+v3KN1emuhwjDEpKpqELhHKwr/T/jlwsqr2AWYCr0RqSFUfVdUiVS1q27ZtbJEmuet6XkfbZm15aOlDNiSAMaZRRJPQtwKdgpY7At8FV1DVfapa5pt/A0gTkRPiFmUKaJ7WnAn5E1i2fRkffPNBosMxxqSgaBL6Z0B3EekqIunAVcBrwRVE5EQREd98P1+7u+IdbLK75NRL6NqqKw9//jBVnqpEh2OMSTH1JnRVrQImAf8C1gLPq+pqEblFRG7xVbscWCUiy4EZwFVq1xVqcDlcTCmcwua9m3l5w8uJDscYk2IkUXm3qKhIlyxpemOGqyrXv3U93+z/hn9e8k+apzVPdEjGmCQiIktVtSjSOtfRDqap8w8JcN2b1/H0mqcZ32d8okNKWR71cKDyAGWVZeyv2F89rfBO91d654PXl1WUcaDqABnODLLTsslKyyI73TdNC5qme6fhZVmuLJwOZ6IP3TRRltATIP8n+QzpPIQnVj/BFTlX0DqzdaJDOuaoKuWV5RGTcY0yXyIOSdK+elrjhqxQLnGRne5NzC3SW5Cdns2JzU/ksPsw+yv2s618G2WVZZRXlkc9yFozVzNapLUIJP2Qk0GEk0NtJ4w0R1o8nkrThFhCT5AphVNY8OoC7ll0D8XtinGIA6fDiVOc3nn/1FdWW3lwmcvhClmOVOYUJ05H3ds5xYnvM+4GUVUOVB2oNQHXlowD85X7Ka8sx6OeOvcTKRl3zO7onfclyhZpLQLrWqR5p8Hzmc7MqI/V7XFzoOqA90TjOy7/ScdfFrJc6atTUc7OgztDtqvvRAOQ6cys/R1CFCcH//EF/l1QPOpB0cCts6pK4D/fPHjf3QQvR6pXY4ri/V/rrh+hnv/fOlJ9//79gv+9xHdXtb9MkJD58G3E95+/LFBHiLg+UjuB9bW0U9d68VagZXpLWmW0qu8lEDNL6AnStVVXxvYey2MrH2Ph1oWJDqcG/wkh/EQQfLLwn2j8J4jDVYejTsZOcYYk4xbpLeiQ3aFGMg5PwIFpeouYknE8OB3OQKxkNbwdVeVg1cGQhF/XySG47Nuyb6vrVZRTpXa3VDIa23ssU/tOjXu79qFogh12H8btceNWd2DqUY93Wd14PJ4aZbWV+8sCy751weXBZVVahUc91WXqocpTFbIcHlPEOr7YM5wZgSTdMr1lrck4Oy2bZq5mRzUZpyJV5bD7cOjJIOzkcLDqIODtGTrEEZj39xrDe7YOHNVl/jpB9f3lDnHU6IGG1JPqfQZ6vUKNejWmwfXC2g0/9kDvPexdhK+w7vVU9/ojra+tnRrb+N5t1LU+OMf6y0857hR6tYn4hfp62Yeix7AMZwbYZ2imAUSETFcmma5MTmhm3+MzNh66McakDEvoxhiTIiyhG2NMirCEbowxKcISujHGpAhL6MYYkyIsoRtjTIqwhG6MMSkiYd8UFZEdwJYGbn4CsDOO4SSSHcuxKVWOJVWOA+xY/E5W1Yi/4ZmwhH4kRGRJbV99TTZ2LMemVDmWVDkOsGOJhl1yMcaYFGEJ3RhjUkSyJvRHEx1AHNmxHJtS5VhS5TjAjqVeSXkN3RhjTE3J2kM3xhgTxhK6McakiKRL6CJygYisE5ENIvKbRMfTUCLyuIhsF5FViY7lSIhIJxH5QETWishqEZmS6JgaSkQyReRTEVnuO5Y/JjqmIyUiThFZJiKvJzqWIyEiX4nIShEpFZGk/akzETlOROaLyBe+v5n+cW0/ma6hi4gTWA+cB2wFPgNGqeqahAbWACLyM6AMeEpVeyc6noYSkfZAe1X9XERaAEuBi5P030SALFUtE5E04GNgiqr+J8GhNZiI3AEUAS1VdXii42koEfkKKFLVpP5ikYg8CXykqn8TkXSguaruiVf7ydZD7wdsUNVNqloBPAv8IsExNYiqLgR2JzqOI6Wq21T1c9/8fmAt0CGxUTWMepX5FtN8j+Tp8YQRkY7AhcDfEh2LARFpCfwMmAugqhXxTOaQfAm9A/BN0PJWkjR5pCIR6QIUAJ8kNpKG812iKAW2A++oatIeC/Aw8CvAk+hA4kCBt0VkqYiMS3QwDdQN2AE84bsM9jcRyYrnDpItoUf6mfik7UGlEhHJBl4EblfVfYmOp6FU1a2q+UBHoJ+IJOXlMBEZDmxX1aWJjiVOzlTVQmAYMNF3yTLZuIBCYLaqFgDlQFw/B0y2hL4V6BS03BH4LkGxGB/f9eYXgRJVfSnR8cSD763wAuCCBIfSUGcCF/muPT8LnCMif09sSA2nqt/5ptuBl/Fefk02W4GtQe/65uNN8HGTbAn9M6C7iHT1faBwFfBagmNq0nwfJM4F1qrqQ4mO50iISFsROc433ww4F/gisVE1jKr+P1XtqKpd8P6dvK+q1yY4rAYRkSzfB+74LlGcDyTd3WGq+j3wjYjk+IqGAHG9ecAVz8Yam6pWicgk4F+AE3hcVVcnOKwGEZFngMHACSKyFfi9qs5NbFQNciZwHbDSd+0Z4Leq+kYCY2qo9sCTvrupHMDzqprUt/uliHbAy96+Ay7gH6r6VmJDarDbgBJfh3QTcEM8G0+q2xaNMcbULtkuuRhjjKmFJXRjjEkRltCNMSZFWEI3xpgUYQndGGNShCV0Y4xJEZbQjTEmRfx/bj768C4tuAkAAAAASUVORK5CYII=\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "timing_counties.plot()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 56,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.axes._subplots.AxesSubplot at 0x7fd0aaf1ad90>"
      ]
     },
     "execution_count": 56,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "pvals_counties.plot.scatter(\"PyGeoda\", \"Numba - Multi Thread\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## All tracts"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 47,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Workbench working on a 8-core machine\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/opt/conda/lib/python3.7/site-packages/joblib/externals/loky/process_executor.py:706: UserWarning: A worker stopped while some jobs were given to the executor. This can be caused by a too short worker timeout or by a memory leak.\n",
      "  \"timeout or by a memory leak.\", UserWarning\n",
      "/opt/conda/lib/python3.7/site-packages/joblib/externals/loky/process_executor.py:706: UserWarning: A worker stopped while some jobs were given to the executor. This can be caused by a too short worker timeout or by a memory leak.\n",
      "  \"timeout or by a memory leak.\", UserWarning\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "CPU times: user 47min 7s, sys: 52 s, total: 47min 59s\n",
      "Wall time: 17min 18s\n"
     ]
    }
   ],
   "source": [
    "%%time\n",
    "timing_tracts, pvals_tracts = workbench(tracts_noi, \n",
    "                                        \"median_household_income\", \n",
    "                                        w_tracts_noi, \n",
    "                                        perms=9999, \n",
    "                                        runs=3,\n",
    "                                        save_last=True\n",
    "                                       )"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 48,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "No Numba                 209.010330\n",
       "Numba - Single Thread     51.135469\n",
       "Numba - Multi Thread      26.789729\n",
       "PyGeoda                   40.246421\n",
       "dtype: float64"
      ]
     },
     "execution_count": 48,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "timing_tracts.mean()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 49,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.axes._subplots.AxesSubplot at 0x7fd0b9434290>"
      ]
     },
     "execution_count": 49,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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k5PDF198wdixY4nnV+dXXXUVo0aNYt68eZSUlDB+/Hh69uxZr97SpUtZvnw5xx57LEOHDmXRokUUFxdz7bXXsnDhQrp3787YsWMjbuOmm27illtuYdiwYWzYsIHRo0ezcuXKmGMsKytj6dKlZGdnk5+fz4033ki3bt3YvXs3/fr14/7776eqqooRI0bw6quv0qlTJ55//nnuvPNOZs2aFXVK45tuuonJkyczbtw4nnjiiZjjaUyTk7uZjQfOBkpc8O3TObcX2Bt8vsTM1gC9AM0tINKMvFP+tmrVKqY2gwYNCs0Vc+KJJzJq1CgACgoK+Otf/xqqd8kll5CWlkbPnj3p0aMHq1atonv37txwww2UlZWRnp7O6tWr44q3qKiItWvX8vbbb/Puu+8yaNAgFi9eXO/n9oMHD6Zr166hNuvXr6d169b06NGD7t27AzB27FhmzpxZbxvvvvsuK1asCC3v2LGDnTt30qZNm5hiLCkpoV27dgD06dOHr776im7dupGens5FF10EwOeff055eTlnnHEGEBimqd2n5eXl3HXXXWzbto1du3YxevRoABYtWsRLL70EBKZhvv3222PbaY1oUnI3szHA7cAI59weT3kn4Dvn3H4z6wH0BNYmJVKRQ00MZ9ipFGnK34yMDGpqagBwzrFv377QuvAper3T93qn6w2fJtjMeOSRR+jcuTOffvopNTU15OTk1IvniSee4KmnngICwyjHHntsnfWtW7fmwgsv5MILLyQtLY033nijXnL3xpienk51dTWxzo9VU1PD4sWLY36zCxdp2wA5OTmkp6cDgX3at29fFi9eXK99Q1Map+Km6rFcCvkcsBjIN7ONZnY18DjQBngn7JLHHwHLzOxTYB4wyTn3XcSORSSlIk35m5eXx5IlSwB49dVXqaqqirvfF198kZqaGtasWcPatWvJz89n+/btdOnShbS0NP785z9H/GLx+uuvD31hGZ7YFy1axPfffw/Avn37WLFiBSeccEJM8fTu3Zu1a9eGbgby/PPPR6w3atQoHn/88dByWVlZTP3HIz8/n61bt4aSe1VVVeimI9GmNB46dGidaZiTJZarZcY657o45zKdc12dc087505yznULv+TROfeSc66vc66/c26gc+6/khapiMQtfMrfa665hg8++IDBgwfz0UcfkZubG3ef+fn5jBgxgjPPPJMZM2aQk5PDddddxzPPPMMPf/hDVq9eHXe/a9asYcSIERQUFDBgwACKi4tDQx2NadWqFX/84x8ZM2YMw4YNo3PnzqHhE69HH32U0tJSCgsL6dOnDzNmJP9nOFlZWcybN4/bb7+d/v37U1RUFPpyOdqUxtOnT+eJJ55g0KBBbN++PWmxaMpfkSTSlL8tY9euXbRu3RrnHNdffz09e/bklltuaemwkkpT/orIYeepp56iqKiIvn37sn37dq699tqWDqnF6R6qInLIu+WWW3x3pp4onbmLiPiQkruIiA8puYuI+JCSu4iIDym5i/jMoTjl74IFCzCzOj+4Wrp0KWbGQw891Gjb2onCFixYUGfSshkzZtSb1XHatGmhqX3T09NDzx999NGUvb6GYk4VJXcRnzkUp/yFwBw23l+Xzp07l/79+8fVR3hynzRpEuPGjatT58477wz9UrZVq1ah51OmTIlpGwfTtL4NUXIX8ZlDccpfgOOPP57Kyko2b96Mc4633nqLM888M7T+tNNOC800+c0335CXl1en/fr165kxYwaPPPIIRUVF/M///A/33ntvo2f+4RYuXMiQIUPo0aNHaF8tWLCAkSNHcvnll1NQUADAf/7nfzJ48GCKioq49tprQ0l/8uTJFBcX07dvX37zm9+E+n3rrbdC0xK//PLLce+feOk6d5EUefDjB1n13aqk9tm7Q29uH9z4rIGH2pS/tS6++GJefPFFBgwYwMCBA+tM1tWYvLw8Jk2aROvWrbn11lsBeO+99+KOYdOmTXz44YesWrWKc889l4svvhiAjz/+mPLycrp3787KlSt5/vnnWbRoEZmZmVx33XXMmTOHcePGMW3aNDp06MD+/fspKSlh2bJl9OrVi2uuuYb333+fk046iUsvvTTuuOKl5C7iQ4falL/evi+99FJWrVrF2LFjm+0uTF7nn38+aWlp9OnTh82bN4fKBw8eHJpW+L333mPJkiUMGjQIgIqKCo4++mgAXnjhBWbOnEl1dTWbNm1ixYoV1NTU0L1799Ac9T/72c8iTkucTEruIikSyxl2Kh1qU/4CHHPMMWRmZvLOO+8wffr0OsndG3tlZWXsOyJO3v3gnXvLOxmac47x48fz7//+73Xarlu3joceeohPPvmEI488kgkTJoRiTcW0vg3RmLuITx1KU/563X///Tz44IOhOdIj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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "timing_tracts.plot()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 52,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>No Numba</th>\n",
       "      <th>Numba - Single Thread</th>\n",
       "      <th>Numba - Multi Thread</th>\n",
       "      <th>PyGeoda</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0.2642</td>\n",
       "      <td>0.2629</td>\n",
       "      <td>0.2585</td>\n",
       "      <td>0.0001</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>0.0902</td>\n",
       "      <td>0.0887</td>\n",
       "      <td>0.0884</td>\n",
       "      <td>0.0001</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>0.0097</td>\n",
       "      <td>0.0132</td>\n",
       "      <td>0.0139</td>\n",
       "      <td>0.0001</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>0.3574</td>\n",
       "      <td>0.3575</td>\n",
       "      <td>0.3550</td>\n",
       "      <td>0.0001</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>0.2453</td>\n",
       "      <td>0.2459</td>\n",
       "      <td>0.2340</td>\n",
       "      <td>0.0001</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   No Numba  Numba - Single Thread  Numba - Multi Thread  PyGeoda\n",
       "0    0.2642                 0.2629                0.2585   0.0001\n",
       "1    0.0902                 0.0887                0.0884   0.0001\n",
       "2    0.0097                 0.0132                0.0139   0.0001\n",
       "3    0.3574                 0.3575                0.3550   0.0001\n",
       "4    0.2453                 0.2459                0.2340   0.0001"
      ]
     },
     "execution_count": 52,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pvals_tracts.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 51,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.axes._subplots.AxesSubplot at 0x7fd0af139d10>"
      ]
     },
     "execution_count": 51,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "pvals_tracts.plot.scatter(\"Numba - Multi Thread\", \"No Numba\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "---"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Workbench working on a 8-core machine\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/opt/conda/lib/python3.7/site-packages/joblib/externals/loky/process_executor.py:706: UserWarning: A worker stopped while some jobs were given to the executor. This can be caused by a too short worker timeout or by a memory leak.\n",
      "  \"timeout or by a memory leak.\", UserWarning\n"
     ]
    }
   ],
   "source": [
    "%%time\n",
    "timing_tracts, pvals_tracts = workbench(tracts_noi, \n",
    "                                        \"median_household_income\", \n",
    "                                        w_tracts_noi, \n",
    "                                        perms=99999, \n",
    "                                        runs=3,\n",
    "                                        save_last=True,\n",
    "                                        no_numba=False\n",
    "                                       )"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 64,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Numba - Single Thread    427.269421\n",
       "Numba - Multi Thread     248.592175\n",
       "PyGeoda                  441.695828\n",
       "dtype: float64"
      ]
     },
     "execution_count": 64,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "timing_tracts.mean()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 66,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.axes._subplots.AxesSubplot at 0x7fd0aa313e90>"
      ]
     },
     "execution_count": 66,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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ibKCggJisRgQP2rfvn17Yl7DaRCASCSSeB2JRKirq0vMS71yw8y488476datG6+//jqxWIyOHTs2iee+++7jgQceAOKnUQ4++OBG87t06cLZZ5/N2WefTSQS4cknn2yS3JNjjEaj1NXVJU7NtCYWizFv3ryMN3ap0r03xH9gFI1GgfgyHThwIPPmzWvS/rLLLuNPf/oTQ4cO5aGHHmLu3LmJefm4wkrJXSRPMtnDzqf999+f8847jwcffJDLL78cgNLSUqqqqjjvvPP485//TG1tbdb9PvLII1x66aWsWrWKlStX0q9fPzZt2kRJSQmRSITp06en/WJx0qRJTJo0KW2fL730EgMGDGC//fZj+/btLF26lGOPPTajePr378/KlStZvXo1paWlzJo1K229k046iZ///Od897vfBWDhwoWUleX2hnH9+vVjw4YNzJs3jyOPPJLa2lqqq6sZOHAgH3/8Md27d6e2tpYZM2YkvmM46qijmDlzJhdddBEzZszIWSz6QlUkxK677rpGV818/etf57nnnqOiooJXX32Vzp07Z91nv379GD16NCeffDJTp06lY8eOfOMb32D69OkcccQRVFdXZ93vihUrGD16NIMHD2bYsGGUl5cnTnW0plOnTvziF79g3LhxHH300XTr1i1x+iTZPffcQ2VlJUOGDGHAgAFMnTo1qxgzUVRUxKOPPsr111/P0KFDKSsrS3y5/MMf/pAvfvGLnHjiifTv3z/R5u677+a+++5jxIgRbNq0qbmus2aZHtLkU3l5uVdWVrZ3GCK7bNmyZU1OJUj+bdmyhS5duuDuTJo0iT59+nDttde2d1g5lW7dMrMqdy9PV1977iKyx3vggQcoKytj4MCBbNq0iSuvvLK9Q2p3OucuInu8a6+9NnR76rtKe+4iIiGUyW32OprZfDN73czeMLPvB+W3m9m/zGxh8PhSUpsbzextM3vTzMbm8wOIiEhTmZyW2QYc5+5bzKwQeNHMngrm3enudyRXNrMBxG+/NxA4GHjGzPq6++4z6IKISMi1uuce/Mp1S/CyMHi0dInNGcBMd9/m7quAt4GKXY5UREQyltE5dzOLmtlCYD0wx91fDWZdbWaLzOxXZrZfUNYDeC+p+ZqgTETawJ445O/cuXMxMx588MFE2YIFCzAz7rjjjhZaxts2DBQ2d+7cRoOWTZ06tcmo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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "timing_tracts.plot()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## All blocks"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
